/**
 * 基础Store
 * 提供所有Store通用的状态管理功能
 */
import { action } from 'mobx-miniprogram';

/**
 * 基础Store对象
 * 所有业务Store应继承此对象
 */
const baseStore = {
  // 加载状态
  isLoading: false,
  
  // 错误信息
  error: null,
  
  // 加载状态管理
  loading: {
    // 任务列表，用于跟踪特定任务的加载状态
    tasks: {},
    
    // 全局计数器，用于统计当前正在进行的加载任务数量
    counter: 0,
    
    // 添加任务方法，由setTaskLoading调用
    addTask: function(taskName) {
      if (!taskName) return;
      this.tasks[taskName] = true;
      this.counter++;
    },
    
    // 移除任务方法，由setTaskLoading调用
    removeTask: function(taskName) {
      if (!taskName || !this.tasks[taskName]) return;
      delete this.tasks[taskName];
      this.counter = Math.max(0, this.counter - 1);
    },
    
    // 清除所有任务方法
    clearTasks: function() {
      this.tasks = {};
      this.counter = 0;
    }
  },
  
  /**
   * 设置全局加载状态
   * @param {boolean} loading 是否加载中
   */
  setLoading: action(function(loading) {
    this.isLoading = loading;
  }),
  
  /**
   * 设置特定任务的加载状态
   * @param {string} taskName 任务名称
   * @param {boolean} loading 是否加载中
   */
  setTaskLoading: action(function(taskName, loading) {
    if (!taskName) return;
    
    if (loading) {
      this.loading.addTask(taskName);
    } else {
      this.loading.removeTask(taskName);
    }
  }),
  
  /**
   * 清除所有加载状态
   */
  clearLoading: action(function() {
    this.isLoading = false;
    this.loading.clearTasks();
  }),
  
  /**
   * 检查是否有任何正在加载的任务
   * @returns {boolean} 是否有加载中的任务
   */
  hasLoadingTasks: function() {
    return this.loading.counter > 0;
  },
  
  /**
   * 检查特定任务是否正在加载
   * @param {string} taskName 任务名称
   * @returns {boolean} 是否加载中
   */
  isTaskLoading: function(taskName) {
    return !!this.loading.tasks[taskName];
  },
  
  /**
   * 设置错误信息
   * @param {Error|string|null} error 错误信息
   */
  setError: action(function(error) {
    if (typeof error === 'string') {
      this.error = new Error(error);
    } else {
      this.error = error;
    }
    
    // 如果有错误发生，自动停止加载状态
    if (error) {
      this.clearLoading();
    }
  }),
  
  /**
   * 清除错误信息
   */
  clearError: action(function() {
    this.error = null;
  }),
  
  /**
   * 重置Store状态
   * 子类应该覆盖此方法，并在其中调用super.reset()
   */
  reset: action(function() {
    this.isLoading = false;
    this.error = null;
    this.loading.clearTasks();
  })
};

export default baseStore; 